package com.lmz.project.redis.arithmetic;

public class BinaryTest {

    public static void printBinary(int num){
        for (int i = 31; i>=0; i--) {
            System.out.print((num & (1<<i) )==0 ? "0" : "1");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int a=78;
        System.out.println(a);
        printBinary(a);
        int c = 0b1001110; //二进制写法 前面是0b
        System.out.println(c);
        //16进制 0x开头
        int d = 0x4e;
        System.out.println(d);
        //取反 ~
        int e = ~a+1; //相反数  注意：负数的最小值，没有办法取反
        /**
         * 如何计算负数的二进制， -5 ---> 有符号位（最高位0表示正，1表示-） 按照4位表示 5=0101  将正数的二进制-1然后取反
         * -5 ：
         * 5： 0101 ： 0101 -1 = 0100 取反： 1011
         * 1011表示-5
         * 反过来：通过二进制计算十进制
         * 1011 最高位1 表示负数  取反+1
         * 取反 0100 ： 0100 +1 = 0101 ===> 5
         *
         */
        System.out.println(e);

        int f  =Integer.MIN_VALUE;
        System.out.println(f);

        System.out.println(-f);
        System.out.println(~f+1);

        // | & ^ 或 与 异或

        //左移 <<  右移 >> >>>
        //左移：空位用0去补位
        //右移：有两种：>> 如果是负数，最高位是1 右移用最高位去补； >>> 右移用0去补

        //对于非负数： 左移 << 1 相当于乘以2
        //对于非负数： 左移 << 2 相当于乘以4
        //对于非负数： 左移 << 3 相当于乘以8
        //对于非负数： 左移 << i 相当于乘以2的i次方

        //..
        //对于非负数： 右移 >> 1 相当于除以2
        //对于非负数： 右移 >> 2 相当于除以4
        //对于非负数： 右移 >> 3 相当于除以8
        //对于非负数： 右移 >> 3 相当于除以2的i次方
    }
}
